package fr.auzaiphe.admin.view;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Observable;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JTextArea;
import javax.swing.UIManager;

import fr.auzaiphe.admin.controller.AdminController;
import fr.auzaiphe.admin.model.AdminModel;
import fr.auzaiphe.commun.View;

/**
 * Vue principale de l'application.
 * Instancie la fenetre et les différents panels
 * Servira également d'aiguilleur entre les vues
 *
 * @author Jojo
 */
public class AdminView extends View
{
	public static final int REFRESH_ALL = 0;
	public static final int REFRESH_ALERTE = 1;
	public static final int REFRESH_JOUEUR = 2;
	public static final int REFRESH_INDICE = 3;
	public static final int REFRESH_SCENARIO = 4;
	public static final int REFRESH_NOTIF = 5;

	private AdminModel model;			 // Pour memoriser les valeurs du modele
	private AdminController controller;  // Pour envoyer les intéractions de l'utilisateur au controller
	private JFrame fenetre;              // Fenetre de l'admin

	private AdminPanel adminPanel;       // Panel de la vue principale de l'admin

	private JMenuBar menu;
	private JMenu fichier;
	private JMenuItem nouveau;
	private JMenuItem enregistrer;
	private JMenuItem enregistrerSous;
	private JMenuItem charger;

	/**
	 * Constructeur
	 *
	 * @param pModel
	 * @param pController
	 */
	public AdminView( AdminModel pModel,
					  AdminController pController )
	{

		this.model = pModel;
		this.controller = pController;

		this.fenetre = new JFrame("Murder Party");
		this.fenetre.setSize(800, 600);
		this.fenetre.setLocationRelativeTo(null);

		this.fenetre.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
	    //Ca s'est pour éviter que la fenêtre se ferme même si on clique sur "Non"

	    //Définition de l'écouteur à l'aide d'une classe interne anonyme
		this.fenetre.addWindowListener ( new WindowAdapter()
		{
			@Override
			public void windowClosing(WindowEvent e)
			{
				AdminView.this.controller.closeBDD();
				System.exit(0);
			}
	    });

		this.adminPanel = new AdminPanel( this.controller );
		this.fenetre.add( this.adminPanel );

		this.menu = new JMenuBar();
		this.fenetre.setJMenuBar(this.menu);

		this.fichier = new JMenu("Fichier");
		this.menu.add(this.fichier);

		this.nouveau = new JMenuItem("Nouveau");
		this.fichier.add(this.nouveau);
		this.nouveau.addActionListener(new ActionListener()
		{
			@Override
			public void actionPerformed(ActionEvent arg0)
			{
				AdminView.this.controller.ouvrirNouveau();
			}
		});

		this.enregistrer = new JMenuItem("Enregistrer");
		this.fichier.add(this.enregistrer);
		this.enregistrer.addActionListener(new ActionListener()
		{
			@Override
			public void actionPerformed(ActionEvent arg0)
			{
				AdminView.this.controller.enregistrer();
			}
		});

		this.enregistrerSous = new JMenuItem("Enregistrer Sous...");
		this.fichier.add(this.enregistrerSous);
		this.enregistrerSous.addActionListener(new ActionListener()
		{
			@Override
			public void actionPerformed(ActionEvent arg0)
			{
				AdminView.this.controller.enregistrerSous();
			}
		});

		this.charger = new JMenuItem("Charger");
		this.fichier.add(this.charger);
		this.charger.addActionListener(new ActionListener()
		{
			@Override
			public void actionPerformed(ActionEvent arg0)
			{
				AdminView.this.controller.charger();
			}
		});

		this.fenetre.setVisible( true );
		this.model.addObserver( this ); // Ajout de la vue en tant qu'observer du model
	}


	/**
	 * Appelée lorsque le modele se met à jour.
	 *
	 * @param pObservable
	 * @param pObject
	 */
	@Override
	public synchronized void update( Observable pObservable,
						Object pObject )
	{
		int state = ( pObject != null ) ? (Integer) pObject : -1 ;
		this.model = (AdminModel) pObservable;

		this.adminPanel.updateOnglets( this.model , state );

		this.adminPanel.setScenario( this.model.getScenario().getChrono().getSecondesRestantes() );
		this.adminPanel.setTime( this.model.getScenario().getChrono().getSecondesRestantes() );
		this.adminPanel.setPrice( this.model.getScenario().getPrixIndice() );
	}


	/**
	 * Recupère le chat grâce au chemin de puis la vue.
	 * Permet de rendre generique le PacketChat
	 * @return JTextArea texte area du chat
	 */
	@Override
	public JTextArea getChat()
	{
		return this.adminPanel.getTextAreaChat();
	}

}
